主题
读取图片字节流 - GetImageData
函数简介
获取指定图像的二进制数据,数据格式BBGGRRAA(BGRA),每个像素4字节。
接口名称
GetImageDataDLL调用
int GetImageData(long ola, long ptr, long* data, int* size, int* stride);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| ola | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| ptr | 长整数型 | OLAImage对象的地址。 |
| data | 长整数型指针 | 返回图片的数据指针。 |
| size | 整数型指针 | 返回图片的数据长度。 |
| stride | 整数型指针 | 返回图片的步长数据(每行数据字节数)。 |
示例
以下示例演示 从 OLAImage 句柄导出 BGRA 原始字节流并写入磁盘,以及 读回磁盘字节流再载入 的往返流程。推荐配合 GetScreenDataPtr 获取句柄(线程安全)。
SDK 调用
cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
}
ola.FreeImage(imgPtr);
}csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0)
{
if (ola.GetImageData(imgPtr, out long dataPtr, out int size, out int stride) == 1)
{
byte[] bgra = new byte[size];
Marshal.Copy((IntPtr)dataPtr, bgra, 0, size);
File.WriteAllBytes(@"output\screen.bgra", bgra);
}
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
import ctypes
ola = OLAPlugServer()
img_ptr = ola.GetScreenDataPtr(0, 0, 200, 200)
if img_ptr:
ret, data_ptr, size, stride = ola.GetImageData(img_ptr)
if ret == 1:
with open("output/screen.bgra", "wb") as f:
f.write((ctypes.c_char * size).from_address(data_ptr))
ola.FreeImage(img_ptr)java
import com.olaplug.OLAPlugServer;
import com.sun.jna.Pointer;
import java.nio.file.Files;
import java.nio.file.Paths;
OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
var data = ola.GetImageData(imgPtr);
if (data != null && data.success) {
byte[] bgra = new Pointer(data.data.data).getByteArray(0, data.data.size);
Files.write(Paths.get("output/screen.bgra"), bgra);
}
ola.FreeImagePtr(imgPtr);
}go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.GetScreenDataPtr(0, 0, 200, 200)
if imgPtr != 0 {
dataPtr := 0; int size = 0, stride = 0
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
}
ola.FreeImage(imgPtr)
}rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.get_screen_data_ptr(0, 0, 200, 200);
if imgPtr != 0 {
let dataPtr = 0; int size = 0, stride = 0;
if (ola.get_image_data(imgPtr, &mut dataPtr as *mut i32, &mut size as *mut i32, &mut stride as *mut i32) == 1) {
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
}
ola.free_image(imgPtr);
}cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
if(imgPtr) {
var ret = ola.GetImageData(imgPtr)
ola.WriteBytesToFile("output/screen.bgra", ret.data, ret.size)
ola.FreeImage(imgPtr)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
If imgPtr <> 0 Then
ret = ola.GetImageData(imgPtr)
ola.WriteBytesToFile "output/screen.bgra", ret(0), ret(1)
ola.FreeImage(imgPtr)
End Iftext
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 dataPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 size, 整数型
.局部变量 stride, 整数型
ola.创建 ()
imgPtr = ola.GetScreenDataPtr (0, 0, 200, 200)
.如果真 (imgPtr ≠ 0)
ret = ola.GetImageData (imgPtr, dataPtr, size, stride)
.如果真 (ret = 1)
bgraData = 指针到字节集 (dataPtr, size)
写到文件 (“output/screen.bgra”, bgraData)
.如果真结束
ola.FreeImagePtr (imgPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if(imgPtr){
var ret, dataPtr, size, stride = ola.GetImageData(imgPtr);
if(ret == 1) string(dataPtr, size).save("output/screen.bgra");
ola.FreeImage(imgPtr);
}text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
如果真 (imgPtr ≠ 0)
{
长整数 dataPtr = 0
整数 size = 0, stride = 0, ret = 0
ret = ola.GetImageData(imgPtr, dataPtr, size, stride)
如果真 (ret = 1)
{
变量 bgraData <类型 = 字节集类>
bgraData = 指针到字节集(dataPtr, size)
写到文件("output/screen.bgra", bgraData)
}
ola.FreeImagePtr(imgPtr)
}cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1)
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
ola.FreeImage(imgPtr);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (GetImageData(instance, imgPtr, &dataPtr, &size, &stride) == 1) {
WriteBytesToFile(instance, "output/screen.bgra", dataPtr, size);
}
FreeImagePtr(instance, imgPtr); // 勿对 dataPtr 调用 FreeImageData
}csharp
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
GetImageData(instance, imgPtr, out long dataPtr, out int size, out int stride);
byte[] copy = new byte[size];
Marshal.Copy((IntPtr)dataPtr, copy, 0, size);
File.WriteAllBytes(@"output\screen.bgra", copy);
FreeImagePtr(instance, imgPtr);
}python
img_ptr = ola.GetScreenDataPtr(instance, 0, 0, 200, 200)
if img_ptr:
data = c_int64(0); size = c_int(0); stride = c_int(0)
ola.GetImageData(instance, img_ptr, byref(data), byref(size), byref(stride))
raw = (c_char * size.value).from_address(data.value)
open("output/screen.bgra", "wb").write(raw)
ola.FreeImagePtr(instance, img_ptr)返回值
| 返回值 | 说明 |
|---|---|
1 | 成功。 |
0 | 失败。 |
注意事项
| 项目 | 说明 |
|---|---|
| 数据格式 | BGRA(字节顺序 B-G-R-A),每像素 4 字节;width = stride / 4,height = size / stride。 |
| 生命周期 | GetImageData 返回的 data 与 OLAImage 句柄绑定,调用 FreeImagePtr 后 data 即失效;写盘或 memcpy 须在释放句柄 之前 完成。 |
| 释放内存 | 不要 对 GetImageData 的 data 调用 FreeImageData(该接口用于 GetImageBmpData / GetScreenData* 等独立分配的缓冲)。 |
| 推荐写法 | GetScreenDataPtr + GetImageData + FreeImagePtr,替代线程不安全的 GetScreenData。 |
| 各语言写盘 | 先将 data 拷贝到语言原生字节数组再落盘(易语言 指针到字节集、C# Marshal.Copy、Python from_address 等);勿对 GetImageData 的 data 调用 FreeImageData。 |
| 格式 | 若需标准图片文件,优先用 GetImageBmpData 导出 BMP。 |
